package cn.zust.itcost.utils;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class PdfUtils {
    
    /**
     * 从PDF文件中提取文本内容
     * @param file PDF文件
     * @return 提取的文本内容
     */
    public static String extractText(MultipartFile file) throws IOException {
        try (InputStream inputStream = file.getInputStream();
             PDDocument document = PDDocument.load(inputStream)) {
            PDFTextStripper stripper = new PDFTextStripper();
            
            // 设置文本提取参数
            stripper.setSortByPosition(true); // 按位置排序
            stripper.setShouldSeparateByBeads(true); // 按段落分割
            stripper.setLineSeparator("\n"); // 设置行分隔符
            stripper.setParagraphStart("\n"); // 设置段落开始标记
            stripper.setParagraphEnd("\n"); // 设置段落结束标记
            stripper.setPageStart(""); // 不添加页面开始标记
            stripper.setPageEnd(""); // 不添加页面结束标记
            stripper.setSuppressDuplicateOverlappingText(true); // 抑制重复文本
            
            // 逐页提取文本
            StringBuilder content = new StringBuilder();
            for (int i = 1; i <= document.getNumberOfPages(); i++) {
                stripper.setStartPage(i);
                stripper.setEndPage(i);
                String pageText = stripper.getText(document);
                content.append(pageText).append("\n");
            }
            
            // 清理文本
            String text = content.toString();
            text = text.replaceAll("\\s+", " "); // 合并多个空格
            text = text.replaceAll("(?m)^\\s+", ""); // 删除行首空格
            text = text.replaceAll("(?m)\\s+$", ""); // 删除行尾空格
            text = text.replaceAll("(?m)^\\s*$\\n", ""); // 删除空行
            
            return text;
        }
    }
    
    /**
     * 获取PDF文件的元数据信息
     * @param file PDF文件
     * @return 元数据信息Map
     */
    public static Map<String, String> getMetadata(MultipartFile file) throws IOException {
        Map<String, String> metadata = new HashMap<>();
        try (InputStream inputStream = file.getInputStream();
             PDDocument document = PDDocument.load(inputStream)) {
            PDDocumentInformation info = document.getDocumentInformation();
            metadata.put("标题", info.getTitle());
            metadata.put("作者", info.getAuthor());
            metadata.put("主题", info.getSubject());
            metadata.put("关键词", info.getKeywords());
            metadata.put("创建者", info.getCreator());
            metadata.put("生产者", info.getProducer());
            metadata.put("创建时间", info.getCreationDate() != null ? info.getCreationDate().toString() : "");
            metadata.put("修改时间", info.getModificationDate() != null ? info.getModificationDate().toString() : "");
            metadata.put("页数", String.valueOf(document.getNumberOfPages()));
        }
        return metadata;
    }
    
    /**
     * 获取PDF文件的基本信息
     * @param file PDF文件
     * @return 基本信息Map
     */
    public static Map<String, Object> getBasicInfo(MultipartFile file) throws IOException {
        Map<String, Object> info = new HashMap<>();
        try (InputStream inputStream = file.getInputStream();
             PDDocument document = PDDocument.load(inputStream)) {
            info.put("页数", document.getNumberOfPages());
            info.put("文件大小", file.getSize());
            info.put("文件名", file.getOriginalFilename());
            info.put("文件类型", file.getContentType());
        }
        return info;
    }
} 